package com.zhuiwei.springbootsecurity.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * @EnableWebSecurity 开启WebSecurity模式
 * @author zhuiwei
 * @since  https://docs.spring.io/spring-security/site/docs/5.2.0.BUILD-SNAPSHOT/reference/htmlsingle/#oauth2login-provide-websecurityconfigureradapter
 */
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 定义授权规则
     * 可以重写WebSecurityConfigurerAdapter中的方法来
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests().antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("VIP1")
                .antMatchers("/level2/**").hasRole("VIP2")
                .antMatchers("/level3/**").hasRole("VIP3");
        /*
         * 开启自动配置的登入功能，会创建一个登入页，如果没有权限会来到登录页
         *  1、/login来到登陆页
         *  2、重定向到/login?error表示登陆
         *  3、自定义登入页面：.loginPage("/userlogin");
         *  4、自定义页面用户名和密码通过此方式usernameParameter("user").passwordParameter("pwd")获取。login.html页面的表单通过调用post请求"/login"，就会到此处理
         *        非自定义页面默认是“/login”请求 当自定义页面后需要指定loginProcessingUrl("/login")或者在login.html页面的post的请求改为“/userlogin”
         *
         *
         */
//        http.formLogin();
//        http.formLogin().loginPage("/userlogin");
        http.formLogin().usernameParameter("user").passwordParameter("pwd").loginPage("/userlogin").loginProcessingUrl("/login");

        /*
         * 启自动配置的注销功能:
         *   1、访问/logoutB表示用户注销，情况session
         *   2、注销成功会返回/login?logout页面,即回到登录页
         *  注销成功后回到特定页面如首页通过logoutSuccessUrl("/")配置
         *  3、依旧权限展示不同的列表:
         */
//        http.logout();
        http.logout().logoutSuccessUrl("/");

        /*
         * 开启记住我功能
         *    登陆成功以后，将cookie发给浏览器保存，以后访问页面带上这个cookie，只要通过检查就可以免登陆
         *    点击注销会删除cookie
         *  定义规则，通过rememberMeParameter获取自定义页面参数
         *
         */
//        http.rememberMe();
        http.rememberMe().rememberMeParameter("remeber");
    }

    /**
     * 定义认证规则
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder()).withUser("zhangsan").password("123456").roles("VIP1","VIP2")
                .and()
                .passwordEncoder(new MyPasswordEncoder()).withUser("lisi").password("123456").roles("VIP2","VIP3")
                .and()
                .passwordEncoder(new MyPasswordEncoder()).withUser("wangwu").password("123456").roles("VIP1","VIP3");
    }
}
